#include "../../source/server.hpp"

std::unordered_map<uint64_t, PtrConnection> conns; // 连接池
uint64_t conn_id = 1; 
EventLoop base_loop; // 基础事件循环
std::vector<LoopThread> threads(2); // 线程池
int next_loop = 0; // 轮询线程的下标

void ConnectionDestroy(const PtrConnection &conn){
    conns.erase(conn->Id()); // 从连接池中移除连接
}
void OnConnected(const PtrConnection &conn){
    LOG_DEBUG("NEW CONNECTION: %p", conn.get());
}
void OnMessage(const PtrConnection &conn, Buffer *buf){
    LOG_DEBUG("RECV MSG: %s", buf->GetReadPos());
    buf->MoveReadOffset(buf->ReadableSize());
    std::string msg = "Hello IsLand";
    conn->Send(msg.c_str(), msg.size());
    
    // 通信一次就释放
    conn->Shutdown(); // 关闭连接
}

void NewConnection(int fd)
{
    PtrConnection conn (new Connection(threads[next_loop].Loop(), conn_id, fd));
    // 注意: 这里 conn 由于有 shared_from_this() 的调用, 所以不能直接作为参数传递给回调函数, 否则会出现循环引用
    conn->SetMessageCallback(std::bind(OnMessage, std::placeholders::_1, std::placeholders::_2)); 
    conn->SetSrvClosedCallback(std::bind(ConnectionDestroy, std::placeholders::_1));
    conn->SetConnectedCallback(std::bind(OnConnected, std::placeholders::_1)); // 连接建立时的回调函数

    conn->EnableInactiveRelease(10); // 10秒内无任何事件, 则释放连接
    conn->Established(); // 就绪初始化
    conns.insert(std::make_pair(conn_id, conn));

    conn_id++; // 连接池中下一个连接的ID
    next_loop = (next_loop + 1) % threads.size(); // 轮询线程的下标

    LOG_DEBUG("NEW ---------------");
}

int main()
{
    srand(time(nullptr)); // 随机数种子
    Acceptor acceptor(&base_loop, 8080);

    // 为监听套接字, 创建一个 Channel 进行事件的管理及处理
    acceptor.SetAcceptCallback(std::bind(NewConnection, std::placeholders::_1));
    acceptor.Listen(); // 开始监听
    while(1){
        base_loop.Start(); // 事件循环
    }
    return 0;
}